package com.cnc.bas.query;

import java.util.ArrayList;
import java.util.List;

/**
 * 用于页面查询条件的组装
 * @author 阿闲
 * @date   Jun 12, 2007
 * @version 1.0
 */
public class QuerySql {

	private StringBuffer sql;
	
	private List values = new ArrayList();
	
	public void setValues(List values) {
	    this.values = values;
	}

	/**
	 *
	 * @param oriSql 原始的sql，如select * from table
	 */
	public QuerySql(String oriSql){
		if(oriSql == null){
			//todo:throw exception
		}
		this.sql = new StringBuffer(oriSql);
	}
	
	public QuerySql(StringBuffer oriSql){
		if(oriSql == null){
			//todo:throw exception
		}
		this.sql = oriSql;
	}
	
	/**
	 * 
	 * @param column 列名
	 * @param operator 操作符，如"=","<=","like"
	 * @param value
	 */
	public void appendCondition(String column, String operator, Object value){
		
		if(value == null)
			return;
		if(value instanceof String)
			if(((String)value).trim().length() ==0)
				return;
		
		if(this.hasWhere()){
			sql.append(" and ");			
		}else{
			sql.append(" where ");
			
		}
		
		sql.append(column);
		sql.append(" ");
		sql.append(operator);
		sql.append(" ?");
		
		values.add(value);
		
	}
	
	/**
	 * 用于处理orderby等情况，如果是order by 请在最后组装
	 * @param str，如order by column asc
	 */
	public void appendString(String str){
		sql.append(" ");
		sql.append(str);
	}
	
	/**
	 * 组装特殊的情况
	 * @param conditions，如（column1 = ? or column2 = ?）
	 * @param values
	 */
	public void appendConditions(String conditions, List values){
		
		
		
		if(this.hasWhere()){
			sql.append(" and ");			
		}else{
			
			sql.append(" where ");
		}
		sql.append("(");
		sql.append(conditions);
		sql.append(")");
		
		if(values != null && values.size() !=0)
			this.values.addAll(values);
	}	

	/**
	 *  @return 组装后的sql 
	 */
	public String getSql(){
		return sql.toString();
	}
	
	/**
	 * 
	 * @return 查询条件的值
	 */
	public Object[] getValues(){
		return values.toArray();
	}
	
	private boolean hasWhere(){
		String temp = sql.toString().toLowerCase();
		if(temp.indexOf("where") != -1)
			return true;
		return false;
	}
	
	
	
	public static void main(String[] args){
		
		QuerySql qs = new QuerySql("select * from Table2 WHERE A = 'C'");	
		
		qs.appendCondition("cosl4", ">", null);
		qs.appendCondition("col1", "like", "%abc");
		qs.appendCondition("col2", "=", "cdf");
		qs.appendCondition("cosl3", ">", "  ");	
		qs.appendConditions("column1 = ? or column2 = ?", null);
		qs.appendString("order by col33 desc");
		
		System.out.println(qs.getSql());
		
	}
}
